import tkinter

root=tkinter.Tk()    #创建一个实例对象
root.title("图片拼接")   #标题
root.minsize(445,335)   #窗口大小（宽×高）

#设置可自由输入文本框
entry1=tkinter.Entry(root)
entry1.place(x=130,y=30,width=300,height=30)

entry2=tkinter.Entry(root)
entry2.place(x=100,y=70,width=40,height=30)

entry3=tkinter.Entry(root)
entry3.place(x=100,y=110,width=40,height=30)

entry4=tkinter.Entry(root)
entry4.place(x=100,y=150,width=40,height=30)

entry6=tkinter.Entry(root)
entry6.place(x=100,y=190,width=40,height=30)

entry5=tkinter.Entry(root)
entry5.place(x=100,y=230,width=300,height=30)

#设置不可改文本框（列1）
label1=tkinter.Label(root,text='图片集所在路径',bg='yellow')
label1.place(x=20,y=30,width=100,height=30)

label2=tkinter.Label(root,text='行数',bg='yellow')
label2.place(x=20,y=70,width=70,height=30)

label3=tkinter.Label(root,text='列数',bg='yellow')
label3.place(x=20,y=110,width=70,height=30)

label4=tkinter.Label(root,text='清晰度',bg='yellow')
label4.place(x=20,y=150,width=70,height=30)

label5=tkinter.Label(root,text='保存路径',bg='yellow')
label5.place(x=20,y=230,width=70,height=30)

label6=tkinter.Label(root,text='图片格式',bg='yellow')
label6.place(x=20,y=190,width=70,height=30)

label7=tkinter.Label(root,text='建议<1000，越高越清晰但内存越大',bg='grey')
label7.place(x=160,y=150,width=205,height=30)

label8=tkinter.Label(root,text='选填 jpg或png，不区分大小写',bg='grey')
label8.place(x=160,y=190,width=180,height=30)

label9=tkinter.Label(root,text='说明：尽量保证需要拼接的图片数量=行×列')
label9.place(x=20,y=270,width=240,height=30)

from PIL import Image, ImageDraw

def start():
    #从存放图片的文件夹中提取所有图片合成大图，并储存
    import os
    
    IMAGES_PATH = entry1.get()+"\\"  # 图片集地址
    if entry6.get().lower() == 'jpg':
        IMAGES_FORMAT = ['.jpg', '.JPG']  # 图片格式
    else:
        IMAGES_FORMAT = ['.png', '.PNG']  # 图片格式
    IMAGE_SIZE = eval(entry4.get()) # 每张小图片的大小
    IMAGE_ROW = eval(entry2.get()) # 图片间隔，也就是合并成一张图后，一共有几行
    IMAGE_COLUMN = eval(entry3.get())  # 图片间隔，也就是合并成一张图后，一共有几列
    IMAGE_SAVE_PATH = entry5.get()+'\拼接图.bmp'  # 图片转换后的地址
    # 获取图片集地址下的所有图片名称
    image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if os.path.splitext(name)[1] == item]
    # 简单的对于参数的设定和实际图片集的大小进行数量判断
    if len(image_names) < IMAGE_ROW * IMAGE_COLUMN:
#        raise ValueError("合成图片的参数和要求的数量不能匹配！")
     
        def new_image(width, height, text, color='black', show_image=False):
            new_img = Image.new('RGB', (int(width), int(height)), color)
            new_img.save(entry1.get()+'\最后面去%s_%s_%s.jpg' % (width, height, text))
        
        img = Image.open('星之守护者 辛德拉.jpg')
        (x,y) = img.size
        for i in range(1,IMAGE_ROW * IMAGE_COLUMN-len(image_names)+1):
            new_image(x, y, '临时填充图片'+str(i), show_image=True)
        

    # 定义图像拼接函数
    def image_compose():
        IMAGE_ROW = eval(entry2.get()) 
        IMAGE_COLUMN = eval(entry3.get())
        to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE)) #创建一个新图
            # 循环遍历，把每张图片按顺序粘贴到对应位置上
        for y in range(1, IMAGE_ROW + 1):
                for x in range(1, IMAGE_COLUMN + 1):
                        from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize((IMAGE_SIZE, IMAGE_SIZE),Image.ANTIALIAS)
                        to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE))
        return to_image.save(IMAGE_SAVE_PATH) # 保存新图
    image_compose() #调用函数

btn=tkinter.Button(root,text='拼接合成',bg='orange',command=start)
btn.place(x=290,y=275,width=70,height=40)

root.mainloop()